const fs = require("fs");

/**
 * 解析ASS文件事件部分的通用函数
 * @param {Array} lines - ASS文件的行数组
 * @param {Function} processDialogue - 处理对话行的函数
 * @returns {Array} 处理结果数组
 */
function parseEvents(lines, processDialogue) {
  const results = [];

  // 查找事件部分
  let inEvents = false;
  for (const line of lines) {
    if (line.trim() === "[Events]") {
      inEvents = true;
      continue;
    }

    if (inEvents) {
      // 跳过格式行
      if (line.startsWith("Format:")) {
        continue;
      }

      // 解析对话行
      if (line.startsWith("Dialogue:")) {
        const parts = line.split(",");
        if (parts.length >= 10) {
          const result = processDialogue(parts);
          if (result) {
            results.push(result);
          }
        }
        if ((process.env.wordType = "nomoveeffect")) {
          break;
        }
      }
    }
  }

  return results;
}

/**
 * 解析ASS文件（简化版本，仅提取文本内容用于图片下载）
 * @param {string} assPath - ASS文件路径
 * @returns {Array} 字幕条目数组
 */
function parseASS(assPath) {
  const assContent = fs.readFileSync(assPath, "utf-8");
  const lines = assContent.split("\n");

  return parseEvents(lines, parts => {
    // 提取文本部分（合并所有剩余部分）
    const text = parts.slice(9).join(",");
    // 简单清理ASS标签
    const cleanText = text.replace(/\{\\.*?\}/g, "").replace(/\\N/g, " ");
    return {
      text: cleanText,
    };
  });
}

/**
 * 将ASS时间格式转换为秒
 * @param {string} timeStr - ASS时间字符串 (H:MM:SS.cc)
 * @returns {number} 秒数
 */
function assTimeToSeconds(timeStr) {
  // ASS格式示例: 0:00:01.50
  const timeRegex = /(\d+):(\d{2}):(\d{2})\.(\d{2})/;
  const match = timeStr.match(timeRegex);

  if (match) {
    const hours = parseInt(match[1], 10);
    const minutes = parseInt(match[2], 10);
    const seconds = parseInt(match[3], 10);
    const centiseconds = parseInt(match[4], 10);

    return hours * 3600 + minutes * 60 + seconds + centiseconds / 100;
  }

  return 0;
}

/**
 * 解析ASS文件获取字幕时长信息
 * @param {string} assFile - ASS文件路径
 * @returns {Array} 字幕数组
 */
function parseASSWithDurations(assFile) {
  try {
    const content = fs.readFileSync(assFile, "utf-8");
    const lines = content.split("\n");
    const subtitles = parseEvents(lines, parts => {
      const startTimeStr = parts[1];
      const endTimeStr = parts[2];

      const startTime = assTimeToSeconds(startTimeStr);
      const endTime = assTimeToSeconds(endTimeStr);
      const duration = endTime - startTime;

      // 注意：我们不能在这里访问subtitles变量，因为它还在构建中
      // 所以我们暂时将index设为0，稍后再正确设置
      return {
        index: 0, // 临时值
        startTime: startTimeStr,
        endTime: endTimeStr,
        duration: duration,
        text: parts.slice(9).join(","),
      };
    });

    // 设置正确的索引值
    for (let i = 0; i < subtitles.length; i++) {
      subtitles[i].index = i + 1;
    }

    // 确保字幕时间连续且覆盖整个时间段
    if (subtitles.length > 0) {
      // 确保第一句从0秒开始
      subtitles[0].startTime = "0:00:00.20";

      // 确保每句之间没有间隙，当前句的结束时间等于下一句的开始时间
      for (let i = 0; i < subtitles.length - 1; i++) {
        subtitles[i].endTime = subtitles[i + 1].startTime;
      }
    }

    return subtitles;
  } catch (error) {
    console.error("！！！解析ASS文件失败:", error.message);
    return [];
  }
}

/**
 * 将秒数格式化为ASS时间格式
 * @param {number} seconds - 秒数
 * @returns {string} ASS时间格式 (H:MM:SS.cc)
 */
function formatASSTime(seconds) {
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = Math.floor(seconds % 60);
  const centiseconds = Math.floor((seconds % 1) * 100);

  return `${hours}:${minutes.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}.${centiseconds.toString().padStart(2, "0")}`;
}

module.exports = {
  parseASS,
  assTimeToSeconds,
  parseASSWithDurations,
  formatASSTime,
};
